from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from django.utils import timezone

from category.models import Category


@receiver([post_save, post_delete], sender=Category)
def on_category_change(sender, instance, **kwargs):
    """
    分类数据变更信号接收器
    监听 Category 模型的 post_save（保存）和 post_delete（删除）事件
    当分类数据发生变更时，触发 WebSocket 推送通知
    """
    # 获取 Channel Layer（Django Channels 的核心组件，用于管理 WebSocket 连接）
    channel_layer = get_channel_layer()
    # 向"category_updates"组发送通知（同步调用异步方法）
    async_to_sync(channel_layer.group_send)(
        "category_updates",  # 目标组名
        {
            "type": "category.updated",  # 对应Consumer中的方法名(category_updated)
            "category_id": instance.id,  # 变更的分类ID
            "timestamp": timezone.now().isoformat()  # 变更时间,用ISO格式便于前端解析
        }
    )
